home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Texteditors / ProgEd / sources / ped_searchfold / Gen_FuncFolder.c < prev   
Encoding:
C/C++ Source or Header  |  1996-09-27  |  3.7 KB  |  171 lines

  1.  
  2. /***** Include vari *****/
  3.  
  4. #include "/triton/ped/Ped.h"
  5. #include <strings.h>
  6. #include <math.h>
  7.  
  8.  
  9. /***** Prototipi delle due funzioni che si trovano in fondo al programma.
  10.     Cio' e' necessario per far si che la funzione principale sia la
  11.     prima nel codice! *****/
  12.  
  13. struct Line *MySearchLine( struct Line * , int );
  14. char *mystrstr( char * , char * );
  15.  
  16.  
  17.  
  18. /*****
  19.  *
  20.  * FUNZIONE:    ULONG main(struct PEDWindow *p,LONG ccol,LONG cline,ULONG *start,ULONG *end,char *funcname)
  21.  *
  22.  * SCOPO:    Cerca un blocco racchiuso dalle stringhe iniziali e finali
  23.  *        definite dall'utente e che si trovi a livello 0 (non
  24.  *        racchiuso da un altro blocco dello stesso tipo).
  25.  *
  26.  * NOTA:    Utilizza SEMPRE la funzione geta4() o la direttiva __saveds!
  27.  *
  28.  * RESTITUISCE: TRUE=blocco trovato,FALSE=non trovato.
  29.  *
  30.  ****/
  31.  
  32. ULONG ASM SAVEDS main(RG(a0) struct PEDWindow *p,RG(d0) LONG ccol,RG(d1) LONG cline,RG(a1) ULONG *start,RG(a2) ULONG *end,RG(a3) char *funcname)
  33. {
  34.     struct Line    *line,
  35.             *curstartline;
  36.     int         nline,
  37.              startline;
  38.     char        *pun,
  39.             *pun2,
  40.             *name;
  41.  
  42.  
  43.  
  44.     /***** Scorri dal cursore in su per capire a che livello siamo *****/
  45.  
  46.     curstartline=line=MySearchLine(p->Text->FirstLine,cline);
  47.     nline=cline;
  48.     while(line)
  49.     {
  50.         /***** Se trovo un FOLD certamente non c'e' nulla sopra *****/
  51.         if (line->Folder)
  52.         {
  53.             line=NULL;
  54.             break;
  55.         }
  56.  
  57.         /***** Se c'e' la stringa esci! *****/
  58.         if (name=mystrstr(line->Buffer,p->Text->FileType->FoldStartStr))    break;
  59.  
  60.         /***** Passiamo alla linea precedente *****/
  61.         line=line->PrevLine;
  62.         nline--;
  63.     }
  64.  
  65.     /***** Se non hai trovato la linea ritorna a mani vuote *****/
  66.     if (!line)    return(FALSE);
  67.  
  68.     /***** Abbiamo trovato l'inizio del blocco. Memorizza la posizione in startline *****/
  69.     startline=nline;
  70.  
  71.     /***** Partiamo di nuovo dal punto iniziale e scorriamo verso il basso
  72.         fino a scendere al livello 0 (dove termina il blocco). *****/
  73.     line=curstartline->NextLine;
  74.     nline=cline+1;
  75.     while(line)
  76.     {
  77.         /***** Se trovo un FOLD certamente non c'e' nulla sotto  *****/
  78.         if (line->Folder)
  79.         {
  80.             line=NULL;
  81.             break;
  82.         }
  83.  
  84.         /***** Se c'e' la stringa esci! *****/
  85.         if (mystrstr(line->Buffer,p->Text->FileType->FoldStopStr))    break;
  86.  
  87.         /***** Passiamo alla linea successiva *****/
  88.         line=line->NextLine;
  89.         nline++;
  90.     }
  91.  
  92.     /***** Se line==NULL allora non c'e' il finale!!!!!!!!!!!!!! *****/
  93.     if (!line)    return(FALSE);
  94.  
  95.     /***** Abbiamo trovato anche la fine del blocco. Memorizza le righe
  96.         iniziali e finali del blocco nelle LONG a cui puntato i
  97.         parametri "start" ed "end". *****/
  98.     *start=startline;
  99.     *end=nline;
  100.  
  101.     /***** Vai avanti fino alla fine copiando il nome della funzione *****/
  102.  
  103.     pun=funcname;
  104.     pun2=name+strlen(p->Text->FileType->FoldStartStr);
  105.     while((pun2[0]==32)||(pun2[0]==9))    pun2++;
  106.     while((pun2[0]!=32)&&(pun2[0]!=9)&&(pun2[0]))    *pun++=*pun2++;
  107.     *pun='\0';
  108.  
  109.     /***** Ritorna TRUE *****/
  110.     return(TRUE);
  111. }
  112.  
  113.  
  114.  
  115. /*****
  116.  *
  117.  * FUNZIONE:    struct Line *MySearchLine(struct Line *line,int y)
  118.  *
  119.  * SCOPO:    Cerca l'indirizzo della linea "y-esima" (0=prima) a partire
  120.  *        dalla prima linea del file data da line.
  121.  *        NB: NON tiene conto dei FOLDS.
  122.  *
  123.  * RESTITUISCE: Un puntatore alla linea cercata.
  124.  *
  125.  ****/
  126.  
  127. struct Line *MySearchLine(struct Line *line,int y)
  128. {
  129.     while(((y--)>0)&&(line))    line=line->NextLine;
  130.     return(line);
  131. }
  132.  
  133.  
  134.  
  135. /*****
  136.  *
  137.  * FUNZIONE:    char *mystrstr(char *str,char *sub)
  138.  *
  139.  * SCOPO:    Cerca la stringa "sub" all'interno della stringa "str"
  140.  *        a partire da destra.
  141.  *
  142.  * RESTITUISCE: l'indirizzo della sottostringa in "str".
  143.  *
  144.  ****/
  145.  
  146. char *mystrstr(char *str,char *sub)
  147. {
  148.     int    lstr,
  149.         lsub;
  150.     char    *p,
  151.         *q,
  152.         *r;
  153.  
  154.     lstr=strlen(str);
  155.     lsub=strlen(sub);
  156.  
  157.     for(p=str;p<=str+lstr-lsub;p++)
  158.     {
  159.         q=p;
  160.         r=sub;
  161.         while(*r)
  162.         {
  163.             if (*r!=*q)    break;
  164.             r++;
  165.             q++;
  166.         }
  167.         if (!(*r))    return(p);
  168.     }
  169.     return(NULL);
  170. }
  171.